package com.itany.corejava.code12_集合.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月21日 13:49
 */
public class Test02_遍历集合 {

    public static void main(String[] args) {
        test01();
    }

    /**
     * 普通for循环进行遍历
     */
    public static void test01() {
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 4, 6));
        // 升序遍历
        for (int i = 0; i < list.size(); i++) {
            // System.out.print(list.get(i)+"\t");
            // 遍历时删除所有的偶数,将奇数展示出来
            // 取出当前遍历的元素
            Integer num = list.get(i);
            // 判断是否是偶数
            if (num % 2 == 0) {
                // 如果是偶数,删除
                // 此时出现了问题,有的偶数没有被删除
                // 1,3,4,6 --> 1,3,6
                // 当删除了4之后,6的索引从3变成2
                // 但是2已经遍历过了,6这个元素被跳过了
                // 删除所有偶数功能失败
                // 解决方案:按照降序遍历
                list.remove(num);
            }
        }
        System.out.println(list);
        list = new ArrayList<>(Arrays.asList(1, 3, 4, 6));
        // 降序遍历
        for (int i = list.size() - 1; i >= 0; i--) {
            Integer num = list.get(i);
            if (num % 2 == 0) {
                // 1,3,4,6
                // 先遍历最后一个索引3,发现是偶数被删除
                // 此时最后一个删除后,其他元素索引没有改变
                // 因此,不存在被漏掉的元素
                list.remove(num);
            }
        }
        System.out.println(list);
    }

    /**
     * 增强for循环
     */
    public static void test02() {
        List<String> list = new ArrayList<>(Arrays.asList("admin", "jack", "tom", "alice", "lily"));
        // 该方式所有涉及索引号的操作均无法实现
        for (String name : list) {
            System.out.println(name);
            // 向集合中添加一个新的元素
            // list.add("root"); // 报错
            list.remove("admin"); // 报错
        }
    }

    /**
     * 使用Iterator迭代器遍历
     */
    public static void test03() {
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 4, 5, 8, 11, 12));
        Iterator<Integer> it = list.iterator();
        // 判断迭代器中是否有下一个元素,如果有,说明尚未迭代全,可以继续迭代
        // 当没有下一个元素了,说明集合中的元素进行全部遍历过了
        while (it.hasNext()) {
            // 取到当前下一个元素
            Integer num = it.next();
            System.out.println(num);
            // 删除偶数
            if (num % 2 == 0) {
                // list.remove(num);
                // 删除当前迭代的元素
                it.remove();
            }
        }
        System.out.println(list);
    }
}
